package com.cqjtu.eecs.utils;

import com.alibaba.fastjson.JSON;
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * jwt工具类
 * @author luojun
 * @since 2022-03-05
 */
public class JwtUtils {
    // 签名
    public final static String SIGN = "ali#@!$L@L!L@$12!14!@L@J$!L@$131";
    // 头部储存名
    public final static String HEADER = "Authorization";
    // 过期时间
    public final static Integer EXPIRATION = 1000*60*60*24*7;

    public final static String PASSWORD = "password";

    public final static String USERNAME = "userName";

    /**
     * 创建token
     * @param user 登录用户的信息
     * @return  token
     */
    public static String createToken(User user){
        String token = Jwts.builder()
                .setHeaderParam("typ", "JWT")
                .setSubject(user.getUsername())//主题
                .setIssuedAt(new Date())//生成时间
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION))//过期时间
                .signWith(SignatureAlgorithm.HS512, SIGN)//签名算法
                .claim(HEADER, JSON.toJSONString(user.getAuthorities()))// 权限
                .claim(PASSWORD, user.getPassword())//密码
                .claim(USERNAME, user.getUsername())//用户名
                .compact();
        return token;
    }
    /**
     * 验证token合法性 如果非法则报异常，合法返回Claims,可以从中获取token解析信息
     * @param token
     * @return
     */
    public static Claims checkToken(String token){
//        System.out.println("check");
        return Jwts.parser()
                .setSigningKey(SIGN)
                .parseClaimsJws(token)
                .getBody();
    }


    /**
     * 判断token是否过期
     * @param claims
     * @return 是否过期
     */
    public static boolean isTokenExpired(Claims claims){
        return claims.getExpiration().before(new Date());
    }


}
